/**
 * 思路1：使用数组反转、比较（不推荐！！！）
 * 数字转换为字符串，在转换为数组
 * 数组reverse，再join为字符串
 * 前后字符串进行对比
 */ 
function findPalindromeNumbers1 (max: number): number[] {
  const res: number[] = []
  if (max <= 0) return res
  for (let i = 1; i <= max; i++) {
    // 转换为字符串，转换为数组，再反转，比较
    const s = i.toString()
    if (s === s.split('').reverse().join('')) {
      res.push(i)
    }
  }
  return res
}

/**
 * 思路2：字符串头尾比较（要用栈，不合适。因为栈也一般用数组实现，会慢）
 * 数字转换为字符串
 * 字符串头尾字符比较
 * （也可以用栈，像括号匹配，但要注意奇偶数）
 */ 
function findPalindromeNumbers2 (max: number): number[] {
  const res: number[] = []
  if (max <= 0) return res
  for (let i = 1; i <= max; i++) {
    const s = i.toString()
    const length = s.length
    // 字符串头尾比较
    let flag = true
    let startIndex = 0 // 字符串开始
    let endIndex = length - 1 // 字符串结束
    while (startIndex < endIndex) {
      if (s[startIndex] !== s[endIndex]) {
        flag = false
        break
      } else {
        // 继续比较
        startIndex++
        endIndex--
      }
    }
    if (flag) res.push(i)
  }
  return res
}
/**
 * 思路3：生成翻转数（操作数字更快，推荐！！！）
 * 使用%和Math.floor 生成反转数
 * 前后数字进行对比
 * （全程操作数字，没有字符串类型）
 */ 
function findPalindromeNumbers3 (max: number): number[] {
  const res: number[] = []
  if (max <= 0) return res
  for (let i = 1; i <= max; i++) {
    let n = i
    let rev = 0 // 存储翻转数
    while (n > 0) {
      rev = rev * 10 + n % 10
      n = Math.floor(n / 10)
    }
    if (i === rev) res.push(i)
  }
  return res
}